/**
 * 给定一个长度为 N 的数组 A = [A1, A2, · · · AN ]，数组中有可能有重复出现 的整数。
 * 现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2,A3,··· ,AN。
 * 当修改 Ai 时，小明会检查 Ai 是否在 A1 ∼ Ai−1 中出现过。如果出现过，则 小明会给 Ai 加上 1 ;如果新的 Ai 仍在之前出现过，小明会持续给 Ai 加 1 ，直 到 Ai 没有在 A1 ∼ Ai−1 中出现过。
 * 当 AN 也经过上述修改之后，显然 A 数组中就没有重复的整数了。 现在给定初始的 A 数组，请你计算出最终的 A 数组
 * https://www.luogu.com.cn/problem/P8686
 */
package 题目集.并查集;

import java.io.*;

public class ch13不重复的数组 {
    /**
     * 思路：模拟+哈希去重.(卡时限过的)
     * 正解：
     *  并查集思路：
     *      在模拟中，查找某个数未出现的下一个数时，比自己大的数是连续的，则需要花费 O(n) 的时间。
     *      我们可以通过并查集将所有连续的数，合并到一个集合中，当查找比自己大的数时，只需要查找下一个集合即可。
     */
    static int maxN = 1000001;
    static int[] arr = new int[maxN];
    static int[] parent = new int[maxN];
    static boolean[] set = new boolean[maxN];
    static int n;
    static PrintWriter pr = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    public static void main(String[] args) {
        Reader sc = new Reader();
        n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        fun();
        for (int i = 0; i < n; i++) {
            pr.print(arr[i] + " ");
        }
        pr.flush();
    }

    public static void fun() {
        set[arr[0]] = true;
        for (int i = 1; i < n; i++) {
            if (set[arr[i]]) {
                arr[i] = find(arr[i])+1;   //当前集合中最大的数+1
            }
            if (set[arr[i]+1]){
                union(arr[i],arr[i]+1);
            }
            if (set[arr[i]-1]){
                union(arr[i],arr[i]-1);
            }
            set[arr[i]] = true;
        }
    }
    public static void union(int o1, int o2) {
        o1 = find(o1);
        o2 = find(o2);
        if (o1>o2) {
            parent[o2] = o1;
        }else {
            parent[o1] = o2;
        }
    }
    public static int find(int x) {
        return parent[x] == 0 ? x : (parent[x] = find(parent[x]));
    }

    static class Reader {
        static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

        public static int nextInt() {
            try {
                in.nextToken();
            } catch (Exception ignored) {
            }
            return (int) in.nval;
        }
    }

}
